package com.example.demo.study.lambda;

/**
 * “函数式接口”是指仅仅只包含一个抽象方法的接口，每一个该类型的lambda表达式都会被匹配到这个抽象方法。因为 默认方法 不算抽象方法，所以你也可以给你的函数式接口添加默认方法。
 *     我们可以将lambda表达式当作任意只包含一个抽象方法的接口类型，确保你的接口一定达到这个要求，你只需要给你的接口添加 @FunctionalInterface 注解，编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的。
 * ————————————————
 * 版权声明：本文为CSDN博主「周天祥」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
 * 原文链接：https://blog.csdn.net/u014646662/article/details/52261511
 */
public class LambdaFunctional {

    public static void main(String[] args) {
        LambdaFunctional lambdaFunctional = new LambdaFunctional();

        //		也可以先创建对象
        //		Action1 a1 = ()->System.out.println("hello");
        lambdaFunctional.test1(()-> System.out.println("hello"));


        //Action2<String,Integer> a2 = (f)->"这个数字是:"+f;
        //如果参数就一个,那么还可以这样简写 去掉小括号
        Action2<String,Integer> a2 = f->"这个数字是:"+f;
        lambdaFunctional.test2(a2);

    }

    public void test1(Action1 a){
        a.run();
    }

    public void test2(Action2<String,Integer> a){
        System.out.println(a.run(3));
    }
}

@FunctionalInterface
interface Action1 {
    public void run();
}

interface Action2<T,F>{
    public T run(F f);
}
